Skip to content

추천기능 API를 연동합니다.#331

Merged
dongglehada merged 9 commits into
devfrom
feat/#330-API-Sync
May 14, 2026
Merged

추천기능 API를 연동합니다.#331
dongglehada merged 9 commits into
devfrom
feat/#330-API-Sync

Conversation

@dongglehada

Copy link
Copy Markdown
Member

📌 이슈

✅ 작업 사항

추천 탭 본앱 연동

  • AppCoordinator, AppDelegateRecommendationMainFactory 등록 및 탭바 가장 좌측(index 0)에 추천 탭 추가
  • BottomTabBarController init에 tabItems 파라미터 추가 — 기존 3탭 호출부는 기본값으로 backward compatible 유지

API 연동

연동한 엔드포인트:

엔드포인트 설명
GET /api/v1/auth/me 내 프로필 (레벨, 직업 ID, 닉네임, 프로필 이미지)
GET /api/v1/jobs/{jobId} 직업명 조회
GET /api/v1/maps/recommendations 추천 사냥터 목록 (level, jobId, limit 쿼리)

Reactor / ViewController

  • RecommendationMainReactorviewWillAppear마다 프로필·추천 데이터 재요청
  • 정보 버튼 탭 시 툴팁 표기 (TooltipFactory)
  • 툴팁 레이아웃 충돌 수정 — frame + SnapKit 혼용 → SnapKit 단일 사용

MLSCore

  • NetworkProviderImpl 로깅 — print 전부 제거, Loggable 채택 및 OSLog 기반으로 교체
  • TokenInterceptor 추가 (아래 ETC 참고)

MLSDesignSystem

  • CardList tagChip 레이아웃 충돌 수정

스크린샷

Simulator.Screen.Recording.-.iPhone.17.Pro.-.2026-05-14.at.00.00.22.mov

👀 ETC

⚠️ 임시 처리 — MLSCore TokenInterceptor

MLSCore에 추가한 TokenInterceptor키체인에 직접 접근하는 임시 구현입니다 (service: "keyChain", account: "accessToken" 하드코딩).

현재 앱은 신규 모듈(MLSCore 기반)과 구 모듈(Core / DomainInterface 기반)이 혼재된 상황입니다. 두 아키텍처에 NetworkProvider, Interceptor 등 동일한 이름의 타입이 각각 존재하기 때문에, 한 파일에서 두 모듈을 동시에 import하면 이름 충돌이 발생합니다. 이로 인해 원래대로라면 외부에서 주입받아야 할 의존성을 주입 방식으로 처리할 수 없었고, 임시로 내부에서 직접 생성하는 방식을 택했습니다.

앞으로 남은 도감, 북마크 기능도 신규 모듈로 빠르게 대치하지 않으면 이번과 같은 문제가 반복될 것 같습니다. 추천 화면 이후 작업을 이어가기 위해서도 구 모듈 대치 작업을 진행하는 게 좋을 것 같습니다.

또한 현재 이번 작업에서 job, profile, 추천 레포지토리를 MLSRecommendationFeature 모듈 내에 직접 추가했는데, 앞으로 각 기능 모듈의 Interface에 레포지토리들이 정리되어 공개되면 해당 모듈을 그대로 가져다 쓰는 방식으로 중복 레포지토리 문제도 자연스럽게 해결될 것 같습니다.

⚠️ 커스텀 탭바 safeArea 미반영

BottomTabBarController가 시스템 tabBar를 숨기고 커스텀 탭바를 올리는 구조이다 보니, child VC의 safeAreaInsets.bottom에 탭바 높이가 자동으로 반영되지 않습니다. 현재는 각 화면에서 64pt를 하드코딩으로 넣어주는 방식으로 대응하고 있는데, 이 부분도 개선이 필요해 보입니다. (BottomTabBarController에서 additionalSafeAreaInsets.bottom을 설정하면 해결되지만, 기존 화면들에 미치는 영향 검토가 필요해 별도 작업으로 분리했습니다.)

추천 화면 이후 남은 작업

  • 탭바 알림 배지
  • 로그인 분기 처리
  • 북마크 연동
  • 사냥터 상세화면 연결
  • 수정하기 버튼 연결

…330-API-Sync

# Conflicts:
#	MLS/MLS.xcodeproj/project.pbxproj
- AppCoordinator, AppDelegate에 RecommendationFeature 등록
- MLSCore에 TokenInterceptor 추가 (키체인 직접 접근)
- RecommendationRepositoryImpl 내부에서 NetworkProvider, Interceptor 생성
- UserProfileDTO, JobDTO 응답 래퍼 구조 반영
- RecommendationEndPoint 쿼리 파라미터 Int32 타입 적용
- viewWillAppear마다 데이터 갱신
- 추천 화면 탭바 영역 레이아웃 수정
- MLSCore NetworkProviderImpl 로깅 Loggable 적용
@dongglehada dongglehada requested a review from pinocchio22 May 13, 2026 15:00
@dongglehada dongglehada self-assigned this May 13, 2026
@dongglehada dongglehada added feat 새로운 기능을 추가 fix 버그 수정, 잔잔바리 수정, 병합 시 충돌 해결 labels May 13, 2026

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request introduces the 'Recommendation' feature, including the necessary data layer (DTOs, Endpoints, Repository), domain entities, and presentation layer (Reactor, ViewController, Factory). It also adds a TokenInterceptor for network requests and updates the existing BottomTabBar to support dynamic tab items. My review highlights several areas for improvement: addressing potential cell reuse issues in the collection view, optimizing parallel network requests in the Reactor, externalizing hardcoded configurations (API URLs and Keychain keys), and improving dependency injection to reduce coupling. I also recommend adding error handling for failed network requests to improve the user experience.

Comment thread MLS/MLSCore/Sources/MLSCore/Network/TokenInterceptor.swift
@pinocchio22

pinocchio22 commented May 14, 2026

Copy link
Copy Markdown
Contributor

기존/신규 아키텍처가 섞여 있는 상태에서 구현 및 수정을 하는 것이 쉽지 않으셨을 듯 합니다..

역시 논의했던대로 확실한 모듈 정리가 필요해보이네요 ㅠㅠ TokenInterceptor가 현재 키체인에 직접 접근하는 구조도 최대한 빠르게 정리가 필요해 보입니다. 지금 상황에서는 현실적인 우회로 이해되지만, 이후에 protocol 기반으로 주입하거나 Auth/Core 구조를 정리하는 방향으로 개선하면 될까싶네요..? 어쨌든 구 모듈과 신 모듈이 공존하면서 생기는 동일 타입의 충돌부터 빠르게 해결해 봅시다!!

추가로 커스텀 탭바 safeArea 문제를 이번 PR에서 바로 건드리지 않고 별도 작업으로 분리한 부분도 좋았습니다! 추후 작업 분배에 있어서 빼먹지않고 진행하면 될 것 같아요~

다만 궁금한점이 현재 RecommendationFeature 내부에 profile/job/recommendation repository를 직접 추가했다부분에서 profile/job은 모델을 말씀하시는건가요?? 제가 이해를 잘 못해서 부연 설명 좀 더 부탁드립니다!!

제미나이 피드백 관련 코드 수정사항 없으시면 병합 진행하셔도 될 것 같아요~!

@dongglehada

Copy link
Copy Markdown
Member Author

기존/신규 아키텍처가 섞여 있는 상태에서 구현 및 수정을 하는 것이 쉽지 않으셨을 듯 합니다..

역시 논의했던대로 확실한 모듈 정리가 필요해보이네요 ㅠㅠ TokenInterceptor가 현재 키체인에 직접 접근하는 구조도 최대한 빠르게 정리가 필요해 보입니다. 지금 상황에서는 현실적인 우회로 이해되지만, 이후에 protocol 기반으로 주입하거나 Auth/Core 구조를 정리하는 방향으로 개선하면 될까싶네요..? 어쨌든 구 모듈과 신 모듈이 공존하면서 생기는 동일 타입의 충돌부터 빠르게 해결해 봅시다!!

추가로 커스텀 탭바 safeArea 문제를 이번 PR에서 바로 건드리지 않고 별도 작업으로 분리한 부분도 좋았습니다! 추후 작업 분배에 있어서 빼먹지않고 진행하면 될 것 같아요~

다만 궁금한점이 현재 RecommendationFeature 내부에 profile/job/recommendation repository를 직접 추가했다부분에서 profile/job은 모델을 말씀하시는건가요?? 제가 이해를 잘 못해서 부연 설명 좀 더 부탁드립니다!!

제미나이 피드백 관련 코드 수정사항 없으시면 병합 진행하셔도 될 것 같아요~!

@pinocchio22

DTO와 repository를 말씀드린 거였어요! 부연 설명이 부족했네요.!

현재 RecommendationFeature에 profile / job / recommendation API 호출 메서드를 포함하는 임시 레포지토리와 DTO, Entity를 직접 추가해둔 상태인데요, 원래대로라면

  • recommendation → map 관련 레포
  • job → Auth 피처의 레포
  • profile → 기존에 정의된 레포

에서 가져와야 합니다. 다만 지금은 모듈 분리가 완료되지 않은 상태라 일단 임시로 구성해뒀고, 모듈 정리가 완료되면 각각 원래 레포로 교체할 예정입니다!

@dongglehada dongglehada merged commit 260e9ee into dev May 14, 2026
2 checks passed
@dongglehada dongglehada deleted the feat/#330-API-Sync branch May 14, 2026 09:50
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

feat 새로운 기능을 추가 fix 버그 수정, 잔잔바리 수정, 병합 시 충돌 해결

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants